package com.lefevre.cms.bean.user;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.joda.time.DateTime;

import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 用户管理
 *
 * @author Lefevre
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Entity
@Table(name = "user", uniqueConstraints = {
        @UniqueConstraint(columnNames = {"userName"}),
        @UniqueConstraint(columnNames = {"platformUserId"}
        )}, indexes = {@Index(name = "user_idx", columnList = "state")}
)
public class User implements Serializable {
    private static final long serialVersionUID = 3692366870616346904L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @TableId(type = IdType.INPUT)
    private Long id;

    /**
     * 用户名
     **/
    @Column(length = 30)
    private String userName;

    /**
     * 呢称
     **/
    @Column(length = 50)
    private String nickname;

    /**
     * 密码 密码结构: sha256(sha256(密码)+[盐值])
     **/
    @Column(length = 160)
    private String password;

    /**
     * 盐值
     **/
    @Column(length = 80)
    private String salt;

    /**
     * 安全摘要 需要用户重新登录时改变此值
     **/
    private Long securityDigest;

    /**
     * 是否允许显示用户动态
     **/
    private Boolean allowUserDynamic = true;

    /**
     * 邮箱地址
     **/
    @Column(length = 60)
    private String email;

    /**
     * 密码提示问题
     **/
    @Column(length = 50)
    private String issue;

    /**
     * 密码提示答案
     **/
    @Column(length = 80)
    private String answer;

    /**
     * 绑定手机
     **/
    @Column(length = 20)
    private String mobile;

    /**
     * 是否实名认证
     **/
    private boolean realNameAuthentication = false;

    /**
     * 注册日期
     **/
    @Temporal(TemporalType.TIMESTAMP)
    private Date registrationDate;

    /**
     * 备注
     **/
    @Lob
    private String remarks = "这个人很懒，什么都没有留下";

    /**
     * 当前积分
     **/
    private Long point = 0L;

    /**
     * 当前预存款
     **/
    @Column(precision = 14, scale = 4)
    private BigDecimal deposit = new BigDecimal("0");

    /**
     * 用户类型 10:本地账号密码用户 20: 手机用户 30: 邮箱用户 40:微信用户
     **/
    private Integer type = 10;

    /**
     * 平台用户Id   本地账号密码用户类型为'会员用户名';  手机用户类型为'手机号-mobile';  邮箱用户类型为'邮箱-email';  第三方用户类型的为'第三方用户Id-第三方平台标记',例如微信为'unionid-weixin'
     **/
    @Column(length = 90)
    private String platformUserId;

    /**
     * 用户状态    1:启用   2:停用   11: 启用时删除   12: 停用时删除
     **/
    private Integer state = 1;

    /**
     * 用户版本号
     **/
    private Integer userVersion = 0;

    /**
     * 用户角色名称集合
     **/
    @Transient
    @TableField(exist = false)
    private List<String> userRoleNameList = new ArrayList<>();

    /**
     * 当前等级ID  只用于统计显示,不写入数据库
     **/
    @Transient
    @TableField(exist = false)
    private Integer gradeId;

    /**
     * 当前等级  只用于统计显示,不写入数据库
     **/
    @Transient
    @TableField(exist = false)
    private String gradeName;

    /**
     * 头像路径 不写入数据库
     **/
    @Transient
    @TableField(exist = false)
    private String avatarPath;

    /**
     * 头像名称
     **/
    @Column(length = 50)
    private String avatarName;

    public String getAvatarPath() {
        if (this.avatarPath == null || "".equals(this.avatarPath.trim())) {
            if (this.getRegistrationDate() != null) {
                DateTime dateTime = new DateTime(this.getRegistrationDate());
                String date = dateTime.toString("yyyy-MM-dd");
                //头像路径
                //String _avatarPath = "file"+File.separator+"avatar"+File.separator + date +File.separator;
                this.avatarPath = "file/avatar/" + date + "/";
            }
        }
        return avatarPath;
    }
}
